import org.junit.Assert;
import org.junit.Test;

public class 测试基础语句 {
    @Test
    public void 测试函数定义() {
        测试工具.解释并执行("def MyFunction()\r\n");
    }

    @Test
    public void 测试结构体定义() {
        测试工具.解释并执行("struct MyStruct { var1 }\n");
    }

    @Test
    public void 测试打印语句() {
        var 解释器 = 测试工具.解释并执行("print 1\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "1");
    }


    @Test
    public void 测试If语句() {
        var 解释器 = 测试工具.解释并执行("if 2 < 1 print 2\r\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "");

        解释器 = 测试工具.解释并执行("if 1 < 2 print 2\r\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "2");


        解释器 = 测试工具.解释并执行("""
                if 2 < 1 :
                    print 1
                .
                else:
                    print 2
                .
                """);
        Assert.assertEquals(解释器.打印输出缓存.toString(), "2");


        解释器 = 测试工具.解释并执行("""
                if 1 < 2 :
                    print 1
                .
                else:
                    print 2
                .
                """);
        Assert.assertEquals(解释器.打印输出缓存.toString(), "1");
    }

    @Test
    public void 测试变量定义1() {
        var 解释器 = 测试工具.解释并执行("""
                a = 1
                print a
                """);
        Assert.assertEquals(解释器.打印输出缓存.toString(), "1");
    }

    @Test
    public void 测试变量定义2() {
        var 解释器 = 测试工具.解释并执行("""
                a = 1
                b = a
                print a + b
                """);
        Assert.assertEquals(解释器.打印输出缓存.toString(), "2");
    }

    @Test
    public void 测试While语句() {
        var 解释器 = 测试工具.解释并执行("""
                a = 1
                while a < 100:
                    a = a + 1
                .
                print a
                """);
        Assert.assertEquals(解释器.打印输出缓存.toString(), "100");
    }

    @Test
    public void 测试结构体() {
        var 解释器 = 测试工具.解释并执行("""
                struct Point { x , y }
                p1 = new Point
                p1.x = 1
                p1.y = 2
                print p1.x + p1.y
                """);
        Assert.assertEquals(解释器.打印输出缓存.toString(), "3");
    }

    @Test
    public void 测试函数调用1() {
        var 解释器 = 测试工具.解释并执行("""
                def PrintHelloWorld() print "Hello World!"
                PrintHelloWorld()
                """);
        Assert.assertEquals(解释器.打印输出缓存.toString(), "Hello World!");
    }

    @Test
    public void 测试函数调用2() {
        var 解释器 = 测试工具.解释并执行("""
                def PrintNumber(a) print a
                PrintNumber(100)
                """);
        Assert.assertEquals(解释器.打印输出缓存.toString(), "100");
    }

    @Test
    public void 测试函数调用3() {
        var 解释器 = 测试工具.解释并执行("""
                def PrintAll(a,b,c):
                    print a
                    print b
                    print c
                .
                PrintAll(100, "Hello", 3.14)
                                
                """);
        Assert.assertEquals(解释器.打印输出缓存.toString(), "100Hello3.14");
    }


    @Test
    public void 测试函数调用4() {
        var 解释器 = 测试工具.解释并执行("""
                def PrintAll(a,b,c):
                    print a
                    print b
                    print c
                .
                PrintAll(100, "Hello", 3.14)
                """);
        Assert.assertEquals(解释器.打印输出缓存.toString(), "100Hello3.14");
    }
    

    @Test
    public void 测试函数返回值() {
        var 解释器 = 测试工具.解释并执行("""
                def Add(a,b) return a + b
                print Add(1, 1)
                """);
        Assert.assertEquals(解释器.打印输出缓存.toString(), "2");
    }
}
